#include "coda_cs1237.h"


void coda_cs1237::begin(uint8_t dio,uint8_t clk)
{
    DIO=dio;
    CLK=clk;
    pinMode(DIO,OUTPUT);
    pinMode(CLK,OUTPUT);
}

void coda_cs1237::setpin(uint8_t dio, uint8_t clk)
{
    DIO=dio;
    CLK=clk;
}

void coda_cs1237::config(uint8_t speed   ,       //设置采样率
                         uint8_t channel ,       //采样通道
                         uint8_t gain    ,       //
                         uint8_t refout
                         )
{
    uint8_t i;
    uint8_t dat;
    uint16_t count_i = 0;
    dat =(refout<< 6) | (speed << 4) | (gain<<2)|(channel);
    PIN_OUT()
    D_HIGH();
    PIN_IN();
    C_LOW();
    while (D_IN()==1)
    {
        delay_ms(1);
        count_i++;
        if(count_i>300)
        {
            PIN_OUT();
            D_HIGH();
            C_HIGH();
            return;
        }
    }
    for(i=0;i<29;i++)
    {
        C_HIGH();
        delay_us(1);
        C_LOW();
        delay_us(1);
    }
    PIN_OUT();

    GEN_CLK();
    GEN_CLK();
    GEN_CLK();
    GEN_CLK();
    GEN_CLK();
    GEN_CLK();
    GEN_CLK();
    GEN_CLK();

    for(i=0;i<8;i++)                            // 38 - 45个脉冲了，写8位数据
    {
        C_HIGH();	                            // CLK=1;
        delay_us(1);
        if(dat&0x80)
        {
            D_HIGH();                           // OUT = 1
        }
        else
        {
            D_LOW();
        }
        dat <<= 1;
        C_LOW();	                            // CLK=0;
        delay_us(1);
    }
    D_HIGH();                                   // OUT = 1
    C_HIGH();	                                // CLK=1;
    delay_us(1);
    C_LOW();	                                // CLK=0;
    delay_us(1);
}

uint8_t coda_cs1237::config(void)
{
    uint8_t i;
    uint8_t dat;
    uint16_t count_i = 0;

    PIN_OUT();
    D_HIGH();
    PIN_IN();
    C_LOW();
    while (D_IN()==1)
    {
        delay_ms(1);
        count_i++;
        if(count_i>300)
        {
            PIN_OUT();
            C_HIGH();
            D_HIGH();
            return 0;
        }
    }
    for(i=0;i<29;i++)
    {
        C_HIGH();
        delay_us(1);
        C_LOW();
        delay_us(1);
    }
    PIN_OUT();

    GEN_CLK();//30
    GEN_CLK();//31
    GEN_CLK();//32
    GEN_CLK();//33
    GEN_CLK();//34
    GEN_CLK();//35
    GEN_CLK();//36

    D_HIGH();
    C_HIGH();
    delay_us(1);
    C_LOW();
    delay_us(1);//37

    dat = 0;
    PIN_IN();
    for(i=0;i<8;i++)
    {
        C_HIGH();
        delay_us(1);
        C_LOW();
        delay_us(1);

        dat <<= 1;
        if(D_IN()==1)
        {
            dat++;
        }
    }
    C_HIGH();
    delay_us(1);
    C_LOW();
    delay_us(1);

    PIN_OUT();
    D_HIGH();

    return dat;
}

int32_t coda_cs1237::read()
{
    uint8_t i;
    uint32_t dat = 0;
    uint16_t count_i = 0;
    int32_t temp;

    PIN_OUT();
    D_HIGH();
    PIN_IN();
    C_LOW();
    while (D_IN()==1)
    {
        delay_ms(1);
        count_i++;
        if(count_i>300)
        {
            PIN_OUT();
            C_HIGH();
            D_HIGH();
            return 0;
        }
    }
    dat = 0;
    for(i=0;i<24;i++)
    {
        C_HIGH();
        delay_us(1);
        dat <<= 1;
        if(D_IN()==1)
        {
            dat++;
        }
        C_LOW();
        delay_us(1);
    }

    for(i=0;i<3;i++)
    {
        C_HIGH();
        delay_us(1);
        C_LOW();
        delay_us(1);
    }
    PIN_OUT();
    D_HIGH();

    if(dat&0x00800000)                          // 判断是负数 最高位24位是符号位
    {
        temp=-(((~dat)&0x007FFFFF) + 1);        // 补码变源码
    }
    else
        temp=dat;                               // 正数的补码就是源码

    return temp;
}




